const request = require('base')
const { resolve } = require('dns')
// 生成百度的accessToken
// const apiKey = 'mGojDZvdQKtVproSl50CMeAv'
// const secretKey = 'mMKlr1QZ9jUn5FPWJfKNEUb9YdX064RD'
const apiKey = 'HqbO0IYhThArluBrlEsxGg5G'
const secretKey = 'MCULoLHMNaXtwYa1K1nwlw91K12VRlD7'
const url = `https://aip.baidubce.com/oauth/2.0/token?client_id=${apiKey}&client_secret=${secretKey}&grant_type=client_credentials`
// 该token有效期三十天。过期之后获取最新的token以替换
// const token = '24.83ee00765845bb4c9e97b51c7c7de2fb.2592000.1751098052.282335-119074357'
const token = '24.d776e8f6059dbbec24565b1250d3a682.2592000.1751101809.282335-119076239'
const lastTime = 1748509794946
const expires = 2592000 // 有效期三十天
const getToken = () => {
	return new Promise((resolve, reject) => {
		const {startTime} = request.common
		if (startTime > lastTime + expires * 1000) {
			request.fetchUrl(url, {
				method: 'POST',
				headers: {
					'Content-Type': 'application/json',
					'Accept': 'application/json'
				}
			}).then(res => {
				const {access_token, expires_in} = res.data
				console.log(startTime)
				console.log(access_token)
				console.log(expires_in)
				// 复制打印出来的access_token和expires_in到上面！！
				resolve(access_token)
			}).catch(reject)
		} else {
			resolve(token)
		}
	})
}

const urls = { // https://ai.baidu.com/ai-doc/NLP/1lg53dryv
	// AI作画-高级版-提交请求
	image_task: 'https://aip.baidubce.com/rpc/2.0/ernievilg/v1/txt2imgv2',
	// AI作画-高级版-结果查询
	image_res: 'https://aip.baidubce.com/rpc/2.0/ernievilg/v1/getImgv2'
}

// AI作画高级版 - 提交任务
const highGradeTask = (data, params) => {
	return new Promise((resolve, reject) => {
		const {prompt, style, resolution, imageNum, imageBase64, imageUrl, pdfBase64, pdfPageNum, changeDegree} = data
		var size = [1024, 1024]
		if (resolution) {
			size = resolution.split('x')
			if (size.length !== 2) {
				size = resolution.split('*')
			}
			if (size.length !== 2) {
				size = [1024, 1024]
			}
		}
		const width = parseInt(size[0])
		const height = parseInt(size[1])
		request.fetchUrl(urls.image_task + '?access_token=' + params.accessToken, {
			method: 'POST',
			data: {
				prompt, style, width, height, 
				image_num: imageNum || 1, 
				image: imageBase64, url: imageUrl, pdf_file: pdfBase64, pdf_file_num: pdfPageNum, 
				change_degree: changeDegree
			},
			headers: {
				'Content-Type': 'application/json',
				'Accept': 'application/json'
			}
		}).then(res => {
			const {data, error_msg} = res.data
			const {task_id} = data || {}
			if (task_id) {
				// 复制打印出来的access_token和expires_in到上面！！
				resolve(task_id)
			} else {
				reject(request.getError(error_msg))
			}
		}).catch(reject)
	})
}

// AI作画高级版 - 查询结果
const highGradeRes = (task_id, params, imgList = []) => {
	return new Promise((resolve, reject) => {
		const cycle = () => {
			request.fetchUrl(urls.image_res + '?access_token=' + params.accessToken, {
				method: 'POST',
				data: {task_id},
				headers: {
					'Content-Type': 'application/json',
					'Accept': 'application/json'
				}
			}).then(res => {
				const {data: {
					task_id, task_status, task_progress_detail, task_progress, sub_task_result_list,
					// sub_task_status, sub_task_progress_detail, sub_task_progress, sub_task_error_code, final_image_list, img_url, height, width, img_approve_conclusion
				}, log_id} = res.data
				switch (task_status){
					case 'SUCCESS':
						sub_task_result_list.forEach(item => {
							item.final_image_list.forEach(record => {
								imgList.push({
									url: record.img_url,
									width: record.width,
									height: record.height,
									securityCheckResult: record.img_approve_conclusion,
								})
							})
						})
						resolve(request.getResult({data: imgList}))
						break;
					case 'INIT':
					case 'WAIT':
					case 'RUNNING':
						setTimeout(cycle, 2000)
						break;
					default:
						reject(request.getError('任务失败'))
						break;
				}
			}).catch(reject)
		}
		cycle()
	})
}

/**
 * 百度智能云相关
 */
module.exports = {
	getToken,
	/**
	 * 创建图片任务
	 */
	async generateImage(data, params) {
		const {
			// 接口版本。默认值：1
			version,
			// 图片生成所用的提示词
			prompt, // 必填
			/**
			 * 图片分辨率
			 * 百度v1接口支持以下分辨率：1024x1024、1024x1536、1536x1024
			 * 百度v2接口支持以下分辨率：512x512、640x360、360x640、1024x1024、720x1280、1280x720
			 */
			resolution, // 默认值：1024x1024
			imageNum, // 生成图片数量
			/**
			 * 图片风格
			 * 百度v1接口（AI作画-基础版）支持的风格：探索无限、古风、二次元、写实风格、浮世绘、low poly 、未来主义、像素风格、概念艺术、赛博朋克、洛丽塔风格、巴洛克风格、超现实主义、水彩画、蒸汽波艺术、油画、卡通画
			 * 百度v2接口（AI作画-高级版）不支持传风格，如需指定风格可尝试在提示词内指定
			 */
			style, // 百度v1接口必填。仅百度v1接口支持
			imageBase64, // 参考图base64，仅能指定一个参考文件。仅百度v2接口支持
			imageUrl, // 参考图url，仅能指定一个参考文件。仅百度v2接口支持
			pdfBase64, // 参考图base64，仅能指定一个参考文件。仅百度v2接口支持
			pdfPageNum, // 参考pdf文件页码。仅百度v2接口支持
			changeDegree, // 参考图影响因子，支持 1-10 ；数值越大参考图影响越大。仅百度v2接口支持
		} = data
		if (params && params.provider && params.accessToken) {
			// 是大语言模型的参数。目前仅支持百度
		} else {
			const baidu = require('./baidu')
			params = {
				provider: 'baidu',
				accessToken: await baidu.getToken(),
			}
		}
		return new Promise((resolve, reject) => {
			// 1，创建AI多媒体实例。默认使用uni-ai当创建任务报错时直接使用百度api
			const mediaManager = uniCloud.ai.getMediaManager(params)
			// 2，创建图片生成任务。当前的账号拿到的accessToken报错：Error: No permission to access data
			mediaManager.imageGeneration(data).then(res => {
				const {taskId} = res
				if (taskId) {
					const cycle = () => {
						mediaManager.getGeneratedImage({
							version, taskId,
						}).then(res => {
							/**
							 * status: 任务状态
							 * 	 v1：'RUNNING'（任务执行中）、'SUCCESS'（任务成功）
							 * 	 v2：'INIT'（任务创建中）、'WAIT'（任务等待中）、'RUNNING'（任务执行中）、'FAILED'（任务失败）、'SUCCESS'（任务成功）;
							 * imgList：生成的图片列表
							 * 	url: 生成的图片url
							 * 	securityCheckResult: 图片审核状态。仅百度v2接口支持
							 * 		审核状态有以下几种： 'block'（违规）、'review'（需要人工核查）、'pass'（通过审核）
							 * 
							 */
							const {status, imgList} = res
							switch (status){
								case 'SUCCESS':
									resolve(request.getResult({data: imgList}))
									break;
								case 'INIT':
								case 'WAIT':
								case 'RUNNING':
									setTimeout(cycle, 1000)
									break;
								default:
									reject(request.getError('任务失败'))
									break;
							}
						})
					}
					cycle()
				} else {
					reject(request.getError('没有任务id'))
				}
			}).catch(err => {
				// return resolve(request.getResult({data: [
				// 	{url: 'http://bj.bcebos.com/v1/ai-picture-creation/watermark/2_353485092_0_final.png?authorization=bce-auth-v1%2FALTAKBvI5HDpIAzJaklvFTUfAz%2F2025-05-29T09%3A53%3A06Z%2F2592000%2F%2F174d585ad85beda89c3f80a5824a359be9ab25d9d85ccf4296257843c49e125e'},
				// 	{url: 'http://bj.bcebos.com/v1/ai-picture-creation/watermark/2_354152237_0_final.png?authorization=bce-auth-v1%2FALTAKBvI5HDpIAzJaklvFTUfAz%2F2025-06-05T07%3A40%3A37Z%2F2592000%2F%2F1589b1c71f2247bd9dd12700346a2a9246ad4331ae2352a6b71fd8e78613f24a'},
				// 	// 第三张
				// ]}))
				highGradeTask(data, params).then(res => {
					highGradeRes(res, params).then(resolve).catch(reject)
				}).catch(reject)
			})
		})
	}
}